<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>形参和实参</title>
    <script>
      /*
        形参是定义函数时设置的参数,它没有具体的值,相当于代词,类似于数学中的x和y
        实参是调用函数时传递给函数的具体的值,它是有真正的值的

        传递参数的细节:
        1.实参个数等于形参个数,结果正确
        2.实参个数多于形参个数,多余的实参会被忽略,结果仍然是正确的
        3.实参个数少于形参个数,相当于缺失'原理',结果不正确
      */
      //a和b是形参
      function add(a, b) {
        return a + b
      }

      //3和4是实参
      console.log(add(3, 4))

      /*
        函数参数传递
        1.简单类型 -- 值传递        传参时,拷贝值本身
        2.复杂类型 -- 引用传递      传递时,传的是复杂类型的引用(内存地址)

        为什么这么设计?
        节省程序的内存消耗,提高程序的性能!
      */
      //值传递: 函数调用时,把实参拷贝一份专递给形参,函数内部对实参的副本进行操作,所以函数内部的值发生了变化,而原始值没有改变!!!
      function change1(num) {
        num += 1
        return num
      }
      let num = 10
      console.log(change1(num)) //11
      console.log(num) //10

      //引用传递: 传递的是复杂类型引用,所以内存中从头到尾没有拷贝任何数据,操作的就是复杂类型本身!!!
      function change2(arr) {
        for (let i = 0; i < arr.length; i++) {
          arr[i] += 1
        }
        return arr
      }
      let arr = [1, 2, 3]
      console.log(change2(arr)) //2,3,4
      console.log(arr) //2,3,4
    </script>
  </head>
  <body></body>
</html>
